<?php

namespace app\shop\service\until;


use think\facade\Cache;

class RedisService
{
    private $redis;

    public function __construct($db = 0)
    {
        $host = config('cache.stores.redis.host');
        $port = config('cache.stores.redis.port');
        $password = config('cache.stores.redis.password');
        if (extension_loaded('redis')) {
            $this->redis = new \Redis;
            $this->redis->connect($host, (int)$port, 0);
            if ('' != $password) {
                $this->redis->auth($password);
            }
        } else {
            throw new \BadFunctionCallException('not support: redis');
        }
        if (0 != $db) {
            $this->redis->select((int)$db);
        }
    }

    //设置键值对，可以选择性地设置过期时间
    public function set($key, $value, $ttl = 0)
    {
        if ($ttl > 0) {
            return $this->redis->setex($key, $ttl, $value);
        } else {
            return $this->redis->set($key, $value);
        }
    }

    // 获取指定键的值。
    public function get($key)
    {
        return $this->redis->get($key);
    }

    // 删除指定键。
    public function delete($key)
    {
        return $this->redis->del($key);
    }

    // 检查键是否存在。
    public function exists($key)
    {
        return $this->redis->exists($key);
    }

    // 将键的值增加指定的量。
    public function increment($key, $amount = 1)
    {
        return $this->redis->incrBy($key, $amount);
    }

    // 将键的值减少指定的量。
    public function decrement($key, $amount = 1)
    {
        return $this->redis->decrBy($key, $amount);
    }

    // 设置多个键值对。
    public function mset(array $data)
    {
        return $this->redis->mSet($data);
    }

    // mget(array $keys)：获取多个键的值。
    public function mget(array $keys)
    {
        return $this->redis->mGet($keys);
    }

    // 清空所有数据库的数据。
    public function flushAll()
    {
        return $this->redis->flushAll();
    }

    //  清空当前选择的数据库的数据。
    public function flushDB()
    {
        return $this->redis->flushDB();
    }

    // 设置键的过期时间。
    public function expire($key, $ttl)
    {
        return $this->redis->expire($key, $ttl);
    }

    // 将一个元素推送到列表的左边
    public function lPush($key, $value)
    {
        return $this->redis->lPush($key, $value);
    }

    // 将一个元素推送到列表的右边
    public function rPush($key, $value)
    {
        return $this->redis->rPush($key, $value);
    }

    // 从列表的左边弹出一个元素
    public function lPop($key)
    {
        return $this->redis->lPop($key);
    }

    // 从列表的右边弹出一个元素
    public function rPop($key)
    {
        return $this->redis->rPop($key);
    }

    // 获取列表中指定范围的元素
    public function lRange($key, $start, $end)
    {
        return $this->redis->lRange($key, $start, $end);
    }

    // 获取列表的长度
    public function lLen($key)
    {
        return $this->redis->lLen($key);
    }

    // 从列表中移除指定数量的元素
    public function lRem($key, $count, $value)
    {

        return $this->redis->lRem($key, $count, $value);

    }

    // 获取列表中指定索引位置的元素
    public function lIndex($key, $index)
    {

        return $this->redis->lIndex($key, $index);

    }

    // 设置列表中指定索引位置的元素
    public function lSet($key, $index, $value)
    {

        return $this->redis->lSet($key, $index, $value);

    }

    // 设置哈希表中的字段值
    public function hSet($key, $field, $value)
    {

        return $this->redis->hSet($key, $field, $value);

    }

    // 获取哈希表中指定字段的值
    public function hGet($key, $field)
    {

        return $this->redis->hGet($key, $field);

    }

    // 删除哈希表中的字段
    public function hDel($key, $field)
    {

        return $this->redis->hDel($key, $field);

    }

    // 获取哈希表中所有字段和值
    public function hGetAll($key)
    {

        return $this->redis->hGetAll($key);

    }

    // 获取哈希表中所有字段
    public function hKeys($key)
    {

        return $this->redis->hKeys($key);

    }

    // 获取哈希表中所有值
    public function hVals($key)
    {

        return $this->redis->hVals($key);

    }

    // 检查哈希表中字段是否存在
    public function hExists($key, $field)
    {

        return $this->redis->hExists($key, $field);

    }

    // 获取哈希表中字段的数量
    public function hLen($key)
    {

        return $this->redis->hLen($key);

    }

    // 向集合中添加一个或多个成员
    public function sAdd($key, ...$members)
    {

        return $this->redis->sAdd($key, ...$members);

    }

    // 移除集合中的一个或多个成员
    public function sRem($key, ...$members)
    {

        return $this->redis->sRem($key, ...$members);

    }

    // 获取集合中的所有成员
    public function sMembers($key)
    {

        return $this->redis->sMembers($key);

    }

    // 判断指定成员是否在集合中
    public function sIsMember($key, $member)
    {

        return $this->redis->sIsMember($key, $member);

    }

    // 获取集合的成员数量
    public function sCard($key)
    {

        return $this->redis->sCard($key);

    }

    // 获取集合的随机成员
    public function sRandMember($key, $count = 1)
    {

        return $this->redis->sRandMember($key, $count);

    }

    // 获取集合的差集
    public function sDiff(...$keys)
    {

        return $this->redis->sDiff(...$keys);

    }

    // 获取集合的交集
    public function sInter(...$keys)
    {

        return $this->redis->sInter(...$keys);

    }    // 获取集合的并集

    public function sUnion(...$keys)
    {

        return $this->redis->sUnion(...$keys);

    }

    // 向有序集合中添加一个或多个成员
    public function zAdd($key, $score, $member)
    {

        return $this->redis->zAdd($key, $score, $member);

    }

    // 移除有序集合中的一个或多个成员
    public function zRem($key, $member)
    {

        return $this->redis->zRem($key, $member);

    }

    // 获取有序集合中指定成员的分数
    public function zScore($key, $member)
    {

        return $this->redis->zScore($key, $member);

    }

    // 获取有序集合中指定范围内的成员
    public function zRange($key, $start, $stop, $withScores = false)
    {

        return $this->redis->zRange($key, $start, $stop, $withScores);

    }

    // 获取有序集合中指定分数范围内的成员
    public function zRangeByScore($key, $min, $max, $withScores = false)
    {

        return $this->redis->zRangeByScore($key, $min, $max, $withScores);

    }

    // 获取有序集合中成员的总数
    public function zCard($key)
    {

        return $this->redis->zCard($key);

    }

    // 获取有序集合的成员数量在指定分数范围内
    public function zCount($key, $min, $max)
    {

        return $this->redis->zCount($key, $min, $max);

    }

    // 获取有序集合中指定范围内的成员与分数
    public function zRangeWithScores($key, $start, $stop)
    {

        return $this->redis->zRange($key, $start, $stop, true);

    }
}